#include <iostream>
#include "CmdLineParser.h"
#include <fstream>
#include "BitHandlerOutput.h"
#include "LZP.h"

using namespace std;

	void comprimir(string nombreArchivoOriginal){
			LZP* lzp = new LZP();

			string nombreArchComprimido = nombreArchivoOriginal;
			nombreArchComprimido.append(".lzp");
			BitHandlerOutput* bho = new BitHandlerOutput(nombreArchComprimido.c_str(), ios::binary);
			cout << "Comprimiendo \"" << nombreArchivoOriginal << "\"..." << endl;
			lzp->comprimir(nombreArchivoOriginal, *bho, 0);
			cout << "termino la compresion!" << endl;
			delete bho;
			delete lzp;
	}

	void descomprimir(string nombreArchivoComprimido){
			LZP* lzp = new LZP();

			string nombreArchDescomprimido = nombreArchivoComprimido.substr(0, nombreArchivoComprimido.length()-4);
			string extension = nombreArchDescomprimido.substr(nombreArchDescomprimido.length()-4, nombreArchDescomprimido.length());


			nombreArchDescomprimido = nombreArchivoComprimido.substr(0, nombreArchivoComprimido.length()-8);
			nombreArchDescomprimido = nombreArchDescomprimido.append("_DESCOMPRIMIDO"+extension);

			BitHandlerInput* bhi = new BitHandlerInput(nombreArchivoComprimido.c_str(), ios::binary);

			cout << "Descomprimiendo \"" << nombreArchivoComprimido << "\"..." << endl;
			lzp->descomprimir(nombreArchDescomprimido, *bhi, 0);
			cout << "termino la descompresion!"<< endl;

			delete bhi;
			delete lzp;

	}

	bool archivoA_ComprimirExiste(char* nombreArchiv){
		bool existe = false;

		ifstream file(nombreArchiv);
		existe = file.good();
		file.close();
		return existe;
	}

	void parse(int argc, char**argv){
		CmdLineParser* cmdLineParser = new CmdLineParser();;
		int status = cmdLineParser->parse(argc, argv);
		delete cmdLineParser;
		switch (status) {
		case -1:
			cout << "Cantidad de argumentos invalida. Ejemplo correcto: TP_DATOS -c 3.avi (comprimir el 3.avi)" << endl;
			break;
		case -2:
			cout << "Argumento invalido. Los validos son -c (comprimir) y -x (descomprimir)" << endl;
			break;
		default:

			string nombreArchivo = (string)argv[2];

			if (archivoA_ComprimirExiste(argv[2])){
				if (status == 1) comprimir(nombreArchivo);
				else descomprimir(nombreArchivo);
			}
			else cout << "Imposible hallar el archivo " << nombreArchivo << endl;


		break;
		}
	}

	void compararArchivos(string f1, string f2){
		string parametro = "fc /b " + f1 + " " + f2;// COMPARACION DE DOS, reemplazar por DIFF en LINUX
		system(parametro.c_str());
	}

int main(int argc, char**argv) {

	int argcComprimir;
	int argcDescomprimir;
	char** argvComprimir;
	char** argvDescomprimir;

	///////////para pruebas////////
		argcComprimir = 3;
		argvComprimir = new char*[argcComprimir];
		argvComprimir[0] = new char[8];
		argvComprimir[0] = "TP_DATOS";
		argvComprimir[1] = new char[2];
		argvComprimir[1] = "-c";
		argvComprimir[2] = new char[30];



		string nombreArchivoComprimir = "g.jpg";///////////////INTRODUCIR EL NOMBRE DEL ARCHIVO A COMPRIMIR... unico parametro necesario


		strcpy(argvComprimir[2], nombreArchivoComprimir.c_str());


	//////////////////////////////

	///////////para pruebas////////
		argcDescomprimir = 3;
		argvDescomprimir = new char*[argcDescomprimir];
		argvDescomprimir[0] = new char[8];
		argvDescomprimir[0] = "TP_DATOS";
		argvDescomprimir[1] = new char[2];
		argvDescomprimir[1] = "-x";

		string nombreArchivoComprimido = nombreArchivoComprimir;
		nombreArchivoComprimido.append(".lzp");

		argvDescomprimir[2] = new char[30];
		strcpy(argvDescomprimir[2], nombreArchivoComprimido.c_str());



		string nombreArchDescomprimido = nombreArchivoComprimido.substr(0, nombreArchivoComprimido.length()-4);
		string extension = nombreArchDescomprimido.substr(nombreArchDescomprimido.length()-4, nombreArchDescomprimido.length());


		nombreArchDescomprimido = nombreArchivoComprimido.substr(0, nombreArchivoComprimido.length()-8);
		nombreArchDescomprimido = nombreArchDescomprimido.append("_DESCOMPRIMIDO"+extension);
	//////////////////////////////

	parse(argcComprimir,argvComprimir);
	parse(argcDescomprimir,argvDescomprimir);
	compararArchivos(nombreArchivoComprimir,nombreArchDescomprimido);
	cout << "FIN DEL PROGRAMA" << endl;

	return 0;





}
